package com.cskaoyan.javase.oop1._1basic;

/**
 * 对象的创建和使用
 * 案例：
 * 创建学生对象，然后访问学生对象的属性，使用学生对象的行为。
 *
 * 要想得到对象，先需要创建对象的模板——类
 *
 * 1.怎么创建一个学生类？
 * 类的创建分为两个部分： 1,类本身的创建  2,类中结构的创建
 * 2.创建学生类
 * 语法：
 *     [各种修饰符] class 类名{
 *         // 类体
 *     }
 * 说明：
 *      1.class类能够使用的修饰符很多，比如public是访问权限修饰符等，目前我们默认一个class的修饰符是public
 *      2.一个Java文件中只允许有一个public class，但是可以有多个非public class
 *      3.在正常的开发中，一个Java文件多数情况下只有一个public class，比较少见有非public class的情况
 *          但是我们在上课时，为了上课演示方便，我们会定义非public class
 *      4.一个Java文件下所有class都是同包的关系。
 *      5.类名大驼峰书写，禁止胡写和小驼峰式。
 *
 * 3.创建学生类的结构
 *      类这种对象的模板如何来描述对象？
 *      类是抽象的，它必须抽象全体对象的属性和行为上的共性。
 * a.类抽取全体对象属性的共性
 *   Java中用"成员变量"来描述全体对象的属性上的共性
 *   成员变量如何创建呢？
 *   局部变量：定义在方法或者一个作用域内部，仅在作用域范围内生效的变量。
 *   局部位置：主要指的类体当中，方法内部或者其它一些作用域内部的位置（说明白点就是有大括号括起来的位置）
 *   成员变量：定义在非局部位置，成员位置的变量。
 *   成员位置：类体当中，局部位置之外的位置。
 *
 *   成员变量的定义语法： [修饰符列表] 数据类型 变量名;
 *   说明：
 *      1.修饰符列表可以有很多，但是现在我们默认不写，为空。
 *      2.数据类型可以是基本数据类型，也可以是引用数据类型。
 *      3.变量名最好"见名知意"，而且遵循小驼峰的命名规则。
 *
 * b.类抽取全体对象行为的共性
 *   Java当中用"成员方法"来描述全体对象在行为上的共性
 *   成员方法如何创建？
 *   成员方法定义在成员位置，不能嵌套定义
 *   它的语法如下：
 *     [修饰符列表] 返回值类型 方法名(形参列表){
 *         // 方法体
 *     }
 *    说明：
 *      1.修饰符列表不能有static，我们默认它是public
 *      2.其它部分和public static方法定义是一致的
 *
 * 以上，我们就完了学生类的定义，我们如何使用类来创建对象呢？
 * 创建对象的语法：
 * 类名 对象名 = new 类名();
 * 创建对象的位置：一般我们都在方法中创建对象，或者在其它作用域中
 * 在以后的上课中，我们会定义一个public class作为测试的类，在测试类中写main方法，在下面定义非public class作为被测试的类，被测试类中我们不写main方法
 *
 * 创建对象之后，如何访问对象的属性，如何调用对象的行为？
 *
 * 对象的属性和行为是属于它自身的，所以也要通过对象名去访问这些成员（变量和方法）
 * 语法：
 *      对象名.成员变量名
 *   对象中的成员变量具有默认初始化，具有默认值
 *   它们的默认值和数组中元素的默认值是一样的
 *      对象名.成员方法名
 * 注意事项:
 *  1.先定义成员变量,再定义成员方法,在java中,我们把成员变量和成员方法,合起来称之为一个类的(普通)成员.
 *  2.成员变量在类中全局都生效,在类中,所有的成员方法(不加static)中都能够访问成员变量,所以成员变量,也叫"全局变量"
 *  3.类可以嵌套定义称之为内部类, 但是请现在不要嵌套定义类，一个Java文件中定义多个class应该并列而不是包含。
 *
 *
 *
 * @since 14:34
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {

    public static void main(String[] args) {
        // 创建Student对象
        // Student stu = new Student();
        // 'com.cskaoyan.javase.oop1._1basic.Demo.this' cannot be referenced from a static context
        Student stu = new Student();

        // com.cskaoyan.javase.oop1._1basic.Student@1540e19d
        /*
            直接打印对象名,实际上得到的也是一个地址值
            com.cskaoyan.javase.oop1._1basic.Student 这是类的全限定类名
            @后面跟一个十六进制数,是对象的地址值
         */
        System.out.println(stu);

        // 访问属性
        System.out.println(stu.gender); //null
        System.out.println(stu.age); //0
        System.out.println(stu.name); //null
        System.out.println(stu.score); //0.0

        // 访问行为
        stu.study();
        stu.sleep();
        System.out.println(stu.test(10));

    }

    // 不要定义内部类
    // static class Student {
    //
    // }

}

class Student {
    // 在这里就可以直接定义成员变量
    /*
        学生对象有哪些属性的共性呢？
            1.姓名 name
            2.年龄 age
            3.性别 gender
            4.分数 score
     */
    String name;
    int age;
    String gender;
    double score;


    // 接下来定义成员方法描述对象行为共性
    /*
        学生对象有哪些行为的共性呢？
           1.学习
           2.睡觉
           3.吃饭
           4.运动
            ....
     */
    public void study() {
        System.out.println("哪有什么天才啊，" + name + "都是把别人刷B站的时间，都用在学习上！");
    }

    public void sleep() {
        System.out.println("你这个" + age + "的年龄,怎么睡得着的？");
    }

    public int test(int a) {
        a = 1000;
        return a;
    }

}